package org.cainiao.io;

import org.cainiao.jvm.other.User;

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.*;
import java.util.PriorityQueue;

import static java.nio.file.StandardWatchEventKinds.*;

/**
 * <br />
 * <p>
 * Author: Cai Niao(wdhlzd@163.com)<br />
 */
public class IOTest {

    public static void main(String[] args) {
        PriorityQueue<User> priorityQueue = new PriorityQueue<>();
        priorityQueue.add(new User());

        Path path = Paths.get("");
        try (InputStream is = Files.newInputStream(path)) {

        } catch (IOException e) {
            e.printStackTrace();
        }

        Watchable watchable = null;
    }

    // WatchService 用于监听文件目录的变化，同一个 WatchService 对象能够监听多个文件目录
    private static void test() throws IOException, InterruptedException {
        // 创建 WatchService 对象
        WatchService watchService = FileSystems.getDefault().newWatchService();
        // 初始化一个被监控文件夹的 Path 类:
        Path path = Paths.get("workingDirectory");
        /*
         * 将这个 path 对象注册到 WatchService（监控服务） 中去
         * Path 类 register 方法的第二个参数 events（需要监听的事件）为可变长参数，可以同时监听多种事件
         * 常用的监听事件有 3 种：
         * StandardWatchEventKinds.ENTRY_CREATE：文件创建
         * StandardWatchEventKinds.ENTRY_DELETE：文件删除
         * StandardWatchEventKinds.ENTRY_MODIFY：文件修改
         */
        WatchKey watchKey = path.register(watchService, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);

        WatchKey key;
        /*
         * 这里一个 WatchService 可能正在观察多个 Path
         * 每个 Path 对应一个 WatchKey，take() 获取其中一个
         * WatchService 就是文件变化的多路复用 Selector
         */
        while ((key = watchService.take()) != null) {
            /*
             * pollEvents() 返回 WatchKey 对应的 Path 上发生的事件
             * 没有事件时不会阻塞，会返回空列表
             */
            for (WatchEvent<?> watchEvent : key.pollEvents()) {
                // TODO
            }
            key.reset();
        }
    }
}
